export type DataTypeValue = 'string' | 'number' | 'integer' | 'boolean' | 'object' | 'array' | 'file'

export interface DataTypeInterface {
  type?: DataTypeValue
  $ref?: string
  items?: DataTypeInterface
}

export class DataType {
  static get String(): DataTypeInterface {
    return { type: 'string' }
  }

  static get Number(): DataTypeInterface {
    return { type: 'number' }
  }

  static get Integer(): DataTypeInterface {
    return { type: 'integer' }
  }

  static get Boolean(): DataTypeInterface {
    return { type: 'boolean' }
  }

  static get Object(): DataTypeInterface {
    return { type: 'object' }
  }

  static Model(model: string): DataTypeInterface {
    return {
      $ref: model ? `#/definitions/${model}` : ''
    }
  }

  static get StringArray(): DataTypeInterface {
    return {
      type: 'array',
      items: { type: 'string' }
    }
  }

  static get NumberArray(): DataTypeInterface {
    return {
      type: 'array',
      items: { type: 'number' }
    }
  }

  static get IntegerArray(): DataTypeInterface {
    return {
      type: 'array',
      items: { type: 'integer' }
    }
  }

  static get ObjectArray(): DataTypeInterface {
    return {
      type: 'array',
      items: { type: 'object' }
    }
  }

  static ModelArray(model: string): DataTypeInterface {
    return {
      type: 'array',
      items: { $ref: model ? `#/definitions/${model}`: '' }
    }
  }

  static get File(): DataTypeInterface {
    return { type: 'file' }
  }
}